/************************************************************************************************************************************************
 *   Copyright (C) 2008 by Denjs                                                                                                                *
 *   dplsoft@pisem.net                                                                                                                          *
 *   http://qdroid.berlios.de                                                                                                                   *
 * -----------------------------------------------------------------------                                                                      *
 *   This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or (at your option) any later version.                                      *
 *   This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of             *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.                                 *
 *   You should have received a copy of the GNU General Public License along with this program; if not, write to the                            *
 *   Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                                                  *
 * -------------------------------------------------------------------------------------------------------------------------------------------- *
 *     Эта программа является свободным программным обеспечением; вы можете распространять её и/или модифицировать в соответствии с лицензией   *
 *   GNU General Public License  (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU) версии 2.0 или более поздней - на ваш выбор.                         *
 *     Эта программа распространяется  в надежде что она будет вам полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, подразумеваемых или явных; без обещаний *
 *   полезности или применимости в конкретных условиях. Вы используете  данное ПО на свой страх и риск и сами полностью несете                  *
 *   ответственность за последствия. См. GNU General Public License (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU).                                  *
 *     Вы должны получить копию GNU General Public License (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU)с данным ПО; Если этого не случилось,       *
 *   обратитесь в Фонд Свободного Программного Обеспечения :                                                                                    *
 *   Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                                                  *
 * -------------------------------------------------------------------------------------------------------------------------------------------  *
 * Замечания для территории России: в соответствии с ГК РФ часть 4, начиная использовать данную программу (исполняемые файлы или исходные       *
 * тексты) вы автоматически соглашаетесь с данной лицензией.
 ************************************************************************************************************************************************/

#ifndef T_QDROID_H
#define T_QDROID_H

#include <QtCore>
#include <QtGlobal>
#include <QtScript>
#include <QScriptContext>

#include <QtScriptTools>
#include <QScriptEngineDebugger>
#include <t_QDroid_QScriptEngineAgent.h>

// # // include <QStringListModel>

//#include "./classes/t_DroidGui.h"
//#include "./classes/t_ObjectRegistry.h"
//#include "./classes/t_FunctionRegistry.h"  <-- TO DELETE!
#include "./classes/t_FunctionRegistryItem.h"// <-- to rename to ScriptFile or else
#include "./classes/t_QDLibManager.h"
#include "./classes/stdInReader.h"
#include "./bots/t_BaseBot.h"
#include "./bots/t_FileList.h"
#include "./bots/t_FileBot.h"
#include "./shared_headers/global_qs_functions.h"

const QString QDroid_WorkProfile_GUI="GUI";
const QString QDroid_WorkProfile_SHELL="SHELL";
const QString QDroid_StandartVar_LocalContext_Name="globalThisObject";

/*
 Основной класс - ядро - диспетчер который управляет остальными объектами
*/
class t_QDroid : public QObject
{
    Q_OBJECT
    public:
        QStringList argList;
        QScriptEngine * getQScriptEngine(); //+2010.05.24 TODO!!!! УДАЛИТЬ!!!! надо переделать так, что бы в этом не возникало необходимосьти
    public slots:
                int init();//
                int init(QStringList argList, QObject * _context=0);//слот на который мы получим сигнал в момент начала цикла событий для инициации.
                //int init2();//test slot
		
		void std_out_resend(QString Message);
		void std_out_resend_HTML(QString Message);
                //QScriptValue script_to_execute(QStringList ScriptSource);
                QScriptValue evaluateScript(QStringList ScriptSource, QObject *context=0);
		void signalHandlerException_rcv( const QScriptValue & exception );
		
		int script_list_item_activated ( const QModelIndex & index );
		int script_list_item_clicked ( const QModelIndex & index );
		int script_list_item_doubleClicked( const QModelIndex & index );

		//2009.09.14 STDIN|STDOUT|STDERR
		//это поучатели - два от внешних объектов системы, один от внутреннего шлюза к каналам
	//	void rcv_to_std_err(QByteArray Message); //--> подключен к SLOT stdReader.send_StdErr
	//	void rcv_to_std_out(QByteArray Message); //--> подключен к SLOT stdReader.send_StdOut
	//	void rcv_from_std_in(QByteArray Message);// -> к нему подключен SIGNAL stdReader.received_StdIn
	//	void rcv_openStdReader();// -> запустить обработку потоков ввода
	//	void rcv_closeStdReader();// -> остановить обработку потоков ввода-вывода
	//	void slot_stdInStream_Closed();
	public:
		t_QDroid(QObject *parent =0);
		~t_QDroid();
	//	QScriptValue qdroid_print_function2(QScriptContext *context, QScriptEngine *engine);
	//	QScriptValue qdroid_exit_function2(QScriptContext *context, QScriptEngine *engine);
		int DebugLevel;
		
		t_FunctionRegistryItem 	*FunctionRegItem;//tmp!

                Q_PROPERTY(QString platformVersion  READ platformVersion WRITE set_platformVersion)
                  QString platformVersion() {return _platformVersion;};
                  void set_platformVersion(QString value) { _platformVersion = value;};

                Q_PROPERTY(bool useGui READ useGui WRITE set_useGui)
                  bool useGui() {return _useGui;};
                  void set_useGui(bool value) { _useGui = value;};

                Q_PROPERTY(bool useDebugger READ useDebugger WRITE set_useDebugger)
                    bool useDebugger() {return _useDebugger;};
                    void set_useDebugger(bool value) { _useDebugger = value;};

                 //bool useGui;//признак того что мы работаем в гуе.
                bool _useGui;//признак того что мы работаем в гуе.
                //QString platformVersion;//строка версии
                QString _platformVersion;//строка версии
                bool _useDebugger; //признак того, что скрипт надо начать выполнять в дебаггере. (в первую строку вставляем указание "debugger")

                //функции работы с исполняемыми скриптами. скажем так - предварительный кеш.
                int loadNewScript(QString _fileName );//++2010.06.24 загрузить скрипт из файла
                QStringList getLoadedScript();//++2010.06.24 вернуть имя скрипта
                QScriptValue runScript(QStringList _source, QObject* _context);//++2010.06.24 выполнить скрипт
                QScriptValue runScript(QString _source, QObject* _context);//++2010.06.24 выполнить скрипт
                    // что делать с _context - скрипт сам должен разобраться. мы его погрузим в скрипт под
                    // под заданным именем а скрипт сам должен решить.

	private:
                QScriptContext *scriptContext; //2011.03.17 probes
                t_QDroid_QScriptEngineAgent *scriptEngineAgent;

//		t_DroidGui 		*DroidGui; // TODO: delete!!!!
                QScriptEngine 		*QSEngine;	// скриптовый движок. один на всех :)
                QScriptEngineDebugger   *hiveDebugger;
                //bool                    isDebuggerAttched;
		//t_ObjectRegistry 	*ObjectReg;	//репозитарий объектов (внешних поставщиков объектов)
/*TODO:delete*/	//t_FunctionRegistry 	*FunctionReg;//репозитарий подключенных функций
		t_BaseBot		*BaseBot;
		t_QDLibManager		*QDLibManager;

/*TODO:delete*/	//QListView		*ScriptListObject;
		//QStringListModel	*StringListModel;
		//QTextEdit		*ScriptDescriptionObject;

/*TODO:delete*/	//QTextEdit 		*StdOutObject;//tmp!

/*TODO:delete*/	//QPushButton *Button1Object;//tmp!

//		int connect_to_regitem(int RegItemIndex);
		QStringList prerpocess_script(QStringList _ScriptSource); //активация препроцессора кода.

		QString WorkProfile;

	signals:
		//это извещатели - по направлению к объъектам системы, один для внутреннего шлюза к каналам
	//	void send_to_std_err(QByteArray Message); //--> подключен к SLOT stdReader.send_StdErr
	//	void send_to_std_out(QByteArray Message); //--> подключен к SLOT stdReader.send_StdOut
	//	void send_from_std_in(QByteArray Message);// -> к нему подключен SIGNAL stdReader.received_StdIn
	//	void sig_stdInStream_Closed();
		
		//void std_out_HTML(QString Message);
public:
	stdInReader stdReader;
        bool doQuitOnErrors;//++2010.06.09
        bool set_doQuitOnErrors(bool newVar);
        QScriptValue setScriptObjectVar(QString _name, QObject* _object);//++2010.07.06
        QScriptValue setScriptVar(QString _name, QString _value);//++2010.07.06
        QScriptValue getScriptVar(QString _name);//++2011.02.22

private :
        bool inited;

        QStringList ScriptSource;//текущий загруженный скрипт
};

#endif // T_QDROID_H
